home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 April: Mac OS SDK / Dev.CD Apr 98 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Samples / SampleCode / Plug-in - QuickDraw Renderer / IRS_Geometry.c next >
Encoding:
C/C++ Source or Header  |  1997-08-14  |  8.6 KB  |  282 lines  |  [TEXT/CWIE]

  1. /******************************************************************************\
  2.                                                                         
  3.         Module:        IRS_Geometry.c                                            
  4.                                                                             
  5.         Purpose:     plug-in renderer for QD3D: geometry rendering                                
  6.                                                                         
  7.         Author:        Sun-Inn Shih    + Roger Holmes                                    
  8.                                                                         
  9.         Parts Copyright (C) 1993-96 Apple Computer, Inc.  All rights reserved.    
  10.         Parts Copyright (C) 1996 Microspot Ltd.  All rights reserved.    
  11.                                                                             
  12. \*****************************************************************************/
  13. #include <QD3D.h>
  14. #include <QD3DGeometry.h>
  15. #include <QD3DView.h>
  16. #include <QD3DDrawContext.h>
  17.  
  18. #include "IRS_Geometry.h"
  19.  
  20. RGBColor ColourFromAttrSet ( TQ3AttributeSet AttributeSet ) ;
  21. RGBColor ColourFromAttrSet ( TQ3AttributeSet AttributeSet )
  22.     {
  23.     RGBColor TheColour ;
  24.     if ( AttributeSet )
  25.         {
  26.         TQ3ColorRGB QColor ;
  27.         if ( Q3AttributeSet_Get ( AttributeSet , kQ3AttributeTypeDiffuseColor , &QColor ) )
  28.             {
  29.             TheColour.red = QColor.r * 0x0000FFFF ;
  30.             TheColour.green = QColor.g * 0x0000FFFF ;
  31.             TheColour.blue = QColor.b * 0x0000FFFF ;
  32.             }
  33.         else
  34.             {
  35.             TheColour.red = 0x7FFF ;
  36.             TheColour.green = 0x7FFF ;
  37.             TheColour.blue = 0x7FFF ;
  38.             }
  39.         }
  40.     else
  41.         {
  42.         TheColour.red = 0x7FFF ;
  43.         TheColour.green = 0x7FFF ;
  44.         TheColour.blue = 0x7FFF ;
  45.         }
  46.     return TheColour ;
  47.     } ;
  48.     
  49.     
  50.     
  51.  
  52. /*
  53.  *  IRS_Geometry_Triangle 
  54.  */
  55. TQ3Status IRS_Geometry_Triangle(
  56.                         TQ3ViewObject         pView,
  57.                         irsData                *irsdata,
  58.                         TQ3GeometryObject    pGeom, 
  59.                         TQ3TriangleData        *pTriangleData)
  60.     {
  61.     // local to Frustum
  62.     float M00 = irsdata->localToFrustum.value[0][0];
  63.     float M01 = irsdata->localToFrustum.value[0][1];
  64.     float M02 = irsdata->localToFrustum.value[0][2];
  65.     float M03 = irsdata->localToFrustum.value[0][3];
  66.  
  67.     float M10 = irsdata->localToFrustum.value[1][0];
  68.     float M11 = irsdata->localToFrustum.value[1][1];
  69.     float M12 = irsdata->localToFrustum.value[1][2];
  70.     float M13 = irsdata->localToFrustum.value[1][3];
  71.  
  72.     float M20 = irsdata->localToFrustum.value[2][0];
  73.     float M21 = irsdata->localToFrustum.value[2][1];
  74.     float M22 = irsdata->localToFrustum.value[2][2];
  75.     float M23 = irsdata->localToFrustum.value[2][3];
  76.  
  77.     float M30 = irsdata->localToFrustum.value[3][0];
  78.     float M31 = irsdata->localToFrustum.value[3][1];
  79.     float M32 = irsdata->localToFrustum.value[3][2];
  80.     float M33 = irsdata->localToFrustum.value[3][3];
  81.     
  82.     // Triangle data
  83.     
  84.     TQ3DrawContextObject DrawContext ;
  85.     if ( Q3View_GetDrawContext ( pView , &DrawContext ) != kQ3Failure )
  86.         {
  87.         CWindowPtr Window ;
  88.         if ( Q3MacDrawContext_GetWindow ( DrawContext , &Window ) != kQ3Failure )
  89.             {
  90.             TQ3Point2D point2D [ 3 ] ;
  91.  
  92.             for ( long j = 0 ; j < 3 ; ++j )
  93.                 {
  94.                 TQ3Point3D point3D = pTriangleData->vertices [ j ].point;
  95.                 
  96.                 point2D [ j ].x = point3D.x * M00 + point3D.y * M10 + point3D.z * M20 + M30 ;
  97.                 point2D [ j ].y = point3D.x * M01 + point3D.y * M11 + point3D.z * M21 + M31 ;
  98.                 float w = 1.0f / ( point3D.x * M03 + point3D.y * M13 + point3D.z * M23 + M33 ) ;
  99.             
  100.                 point2D [ j ].x = irsdata->XOffset + point2D [ j ].x * w * irsdata->XScale ;
  101.                 point2D [ j ].y = irsdata->YOffset - point2D [ j ].y * w * irsdata->YScale ;
  102.                 } ;
  103.             SetPort ( ( GrafPort* ) ( Window ) ) ;
  104.             RGBColor TheColour = ColourFromAttrSet ( pTriangleData->triangleAttributeSet ) ;
  105.             RGBForeColor ( &TheColour ) ;
  106.             MoveTo ( point2D [ 0 ].x , point2D [ 0 ].y ) ;
  107.             LineTo ( point2D [ 1 ].x , point2D [ 1 ].y ) ;
  108.             LineTo ( point2D [ 2 ].x , point2D [ 2 ].y ) ;
  109.             LineTo ( point2D [ 0 ].x , point2D [ 0 ].y ) ;
  110.             }    
  111.         }
  112.     return kQ3Success;
  113.     }
  114.  
  115. /*
  116.  *  IRS_Geometry_Line 
  117.  */
  118. TQ3Status IRS_Geometry_Line(
  119.                     TQ3ViewObject         pView,
  120.                     irsData                *irsdata,
  121.                     TQ3GeometryObject    pGeom, 
  122.                     TQ3LineData            *pLineData)
  123.     {
  124.     // local to Frustum
  125.     float M00 = irsdata->localToFrustum.value[0][0];
  126.     float M01 = irsdata->localToFrustum.value[0][1];
  127.     float M02 = irsdata->localToFrustum.value[0][2];
  128.     float M03 = irsdata->localToFrustum.value[0][3];
  129.  
  130.     float M10 = irsdata->localToFrustum.value[1][0];
  131.     float M11 = irsdata->localToFrustum.value[1][1];
  132.     float M12 = irsdata->localToFrustum.value[1][2];
  133.     float M13 = irsdata->localToFrustum.value[1][3];
  134.  
  135.     float M20 = irsdata->localToFrustum.value[2][0];
  136.     float M21 = irsdata->localToFrustum.value[2][1];
  137.     float M22 = irsdata->localToFrustum.value[2][2];
  138.     float M23 = irsdata->localToFrustum.value[2][3];
  139.  
  140.     float M30 = irsdata->localToFrustum.value[3][0];
  141.     float M31 = irsdata->localToFrustum.value[3][1];
  142.     float M32 = irsdata->localToFrustum.value[3][2];
  143.     float M33 = irsdata->localToFrustum.value[3][3];
  144.     
  145.     // Line data
  146.     
  147.     TQ3DrawContextObject DrawContext ;
  148.     if ( Q3View_GetDrawContext ( pView , &DrawContext ) != kQ3Failure )
  149.         {
  150.         CWindowPtr Window ;
  151.         if ( Q3MacDrawContext_GetWindow ( DrawContext , &Window ) != kQ3Failure )
  152.             {
  153.             TQ3Point2D point2D [ 2 ] ;
  154.  
  155.             for ( long j = 0 ; j < 2 ; ++j )
  156.                 {
  157.                 TQ3Point3D point3D = pLineData->vertices[j].point;
  158.                 
  159.                 point2D [ j ].x = point3D.x * M00 + point3D.y * M10 + point3D.z * M20 + M30 ;
  160.                 point2D [ j ].y = point3D.x * M01 + point3D.y * M11 + point3D.z * M21 + M31 ;
  161.                 float w = 1.0f / ( point3D.x * M03 + point3D.y * M13 + point3D.z * M23 + M33 ) ;
  162.             
  163.                 point2D [ j ].x = irsdata->XOffset + point2D[j].x * w * irsdata->XScale ;
  164.                 point2D [ j ].y = irsdata->YOffset - point2D[j].y * w * irsdata->YScale ;
  165.                 } ;
  166.             SetPort ( ( GrafPort* ) ( Window ) ) ;
  167.             RGBColor TheColour = ColourFromAttrSet ( pLineData->lineAttributeSet ) ;
  168.             RGBForeColor ( &TheColour ) ;
  169.             MoveTo ( point2D [ 0 ].x , point2D [ 0 ].y ) ;
  170.             LineTo ( point2D [ 1 ].x , point2D [ 1 ].y ) ;
  171.             }    
  172.         }
  173.     return kQ3Success ;
  174.     }
  175.  
  176. /*
  177.  *  IRS_Geometry_Point 
  178.  */
  179. TQ3Status IRS_Geometry_Point(
  180.                                 TQ3ViewObject         pView,
  181.                                 irsData                *irsdata,
  182.                                 TQ3GeometryObject     pGeom, 
  183.                                 TQ3PointData        *pPointData)
  184.     {
  185.     return kQ3Success ;
  186.     }
  187.  
  188. /*
  189.  *  IRS_Geometry_Marker 
  190.  */
  191. TQ3Status IRS_Geometry_Marker(
  192.                                 TQ3ViewObject         pView,
  193.                                 irsData                *irsdata,
  194.                                 TQ3GeometryObject     pGeom, 
  195.                                 TQ3MarkerData        *pMarkerData)
  196.     {
  197.     return kQ3Success;
  198.     }
  199.  
  200. /*
  201.  *  IRS_Geometry_PixmapMarker 
  202.  */
  203. TQ3Status IRS_Geometry_PixmapMarker(
  204.                                 TQ3ViewObject         pView,
  205.                                 irsData                    *irsdata,
  206.                                 TQ3GeometryObject     pGeom, 
  207.                                 TQ3PixmapMarkerData    *pPixmapMarkerData)
  208.     {
  209.     return kQ3Success;
  210.     }
  211.  
  212. #if 1
  213. /*
  214.  *  IRS_Geometry_TM 
  215.  */
  216. TQ3Status IRS_Geometry_TM (
  217.                                 TQ3ViewObject         pView,
  218.                                 irsData                *irsdata,
  219.                                 TQ3GeometryObject    pGeom, 
  220.                                 TQ3TriMeshData        *pTriMeshData )
  221.     {
  222.     // local to Frustum
  223.     float M00 = irsdata->localToFrustum.value[0][0];
  224.     float M01 = irsdata->localToFrustum.value[0][1];
  225.     float M02 = irsdata->localToFrustum.value[0][2];
  226.     float M03 = irsdata->localToFrustum.value[0][3];
  227.  
  228.     float M10 = irsdata->localToFrustum.value[1][0];
  229.     float M11 = irsdata->localToFrustum.value[1][1];
  230.     float M12 = irsdata->localToFrustum.value[1][2];
  231.     float M13 = irsdata->localToFrustum.value[1][3];
  232.  
  233.     float M20 = irsdata->localToFrustum.value[2][0];
  234.     float M21 = irsdata->localToFrustum.value[2][1];
  235.     float M22 = irsdata->localToFrustum.value[2][2];
  236.     float M23 = irsdata->localToFrustum.value[2][3];
  237.  
  238.     float M30 = irsdata->localToFrustum.value[3][0];
  239.     float M31 = irsdata->localToFrustum.value[3][1];
  240.     float M32 = irsdata->localToFrustum.value[3][2];
  241.     float M33 = irsdata->localToFrustum.value[3][3];
  242.     
  243.     /* trimesh data */
  244.     TQ3TriMeshTriangleData* trianglelist = pTriMeshData->triangles;
  245.     TQ3Point3D* pointlist = pTriMeshData->points;
  246.  
  247.     TQ3DrawContextObject DrawContext ;
  248.     if ( Q3View_GetDrawContext ( pView , &DrawContext ) != kQ3Failure )
  249.         {
  250.         CWindowPtr Window ;
  251.         if ( Q3MacDrawContext_GetWindow ( DrawContext , &Window ) != kQ3Failure )
  252.             {
  253.             for ( long i = 0 ; i < pTriMeshData->numTriangles ; ++i , ++trianglelist )
  254.                 {
  255.                 TQ3Point2D point2D [ 3 ] ;
  256.                 for ( long j = 0 ; j < 3 ; ++j )
  257.                     {
  258.                     long index = trianglelist->pointIndices [ j ] ;
  259.                     TQ3Point3D point3D = pointlist [ index ] ;
  260.                     
  261.                     point2D [ j ].x = point3D.x * M00 + point3D.y * M10 + point3D.z * M20 + M30;
  262.                     point2D [ j ].y = point3D.x * M01 + point3D.y * M11 + point3D.z * M21 + M31;
  263.                     float w = 1.0f / ( point3D.x * M03 + point3D.y * M13 + point3D.z * M23 + M33 ) ;
  264.                 
  265.                     point2D [ j ].x = irsdata->XOffset + point2D [ j ].x * w * irsdata->XScale ;
  266.                     point2D [ j ].y = irsdata->YOffset - point2D [ j ].y * w * irsdata->YScale ;
  267.                     }    
  268.                 SetPort ( ( GrafPort* ) ( Window ) ) ;
  269.                 RGBColor TheColour = ColourFromAttrSet ( pTriMeshData->triMeshAttributeSet ) ;
  270.                 RGBForeColor ( &TheColour ) ;
  271.                 MoveTo ( point2D [ 0 ].x , point2D [ 0 ].y ) ;
  272.                 LineTo ( point2D [ 1 ].x , point2D [ 1 ].y ) ;
  273.                 LineTo ( point2D [ 2 ].x , point2D [ 2 ].y ) ;
  274.                 LineTo ( point2D [ 0 ].x , point2D [ 0 ].y ) ;
  275.                 }
  276.             }
  277.         }
  278.         
  279.     return kQ3Success ;
  280.     }
  281. #endif
  282.